Feld generisch umsetzen

Aus verschiedenen Gründen könnte es sein, dass Sie Werte eines bestimmten Feldes auf der Datenbank ändern möchten. Normalerweise schreiben Sie dazu ein Programm, dass die Daten für jede Tabelle einliest, das Feld ändert und die Daten wieder zurück schreibt. Wir präsentieren Ihnen hier eine generelle Lösung…

Das folgende Programm enthält eine Routine, mit der Sie generell ein Feld in einer beliebigen Tabelle ändern können.

Die Umsetzung müssen Sie für Ihren Fall natürlich anpassen.

Problemstellung

In einem CHAR(6)-Feld steht eine Nummer mit führenden Nullen, z.B. 000034. Das zugrundeliegende Datenelement soll ab auf ein zweistelliges Characterfeld umgesetzt werden. Bei einer Änderung und anschliessenden Umsetzung der Datenbank würden einfach die ersten beiden Stellen (00) genommen werden. Die eigentliche Information geht also verloren. Handelt es sich um ein Schlüsselfeld, so gehen gehen sogar Datensätze verloren!

Lösungsansatz

In diesem speziellen Fall wird die sechsstellige Nummer, die in einem Characterfeld gespeichert ist, auf eine zweistellige Nummer umgesetzt.

Da es sich um ein Schlüsselfeld handelt, werden die vorhandenen Datensätze gelesen, gelöscht, umgesetzt und anschließend wieder eingefügt.

Coding

*———————————————————————*
* Report  ZZUMS1
*———————————————————————*

REPORT  zzums1.

PARAMETERS p_u1 AS CHECKBOX DEFAULT space.
PARAMETERS p_u2 AS CHECKBOX DEFAULT space.

START-OF-SELECTION.

  IF p_u1 <> space.
    PERFORM change USING ‘ZZTAB1’.    
  ENDIF.

  IF p_u2 <> space.
    PERFORM change USING ‘ZZTAB2’.   
  ENDIF.

*&———————————————————————*
*&      Form  change
*&———————————————————————*
FORM change USING fi_tabname.

*** data
  DATA dref             TYPE REF TO data.
  FIELD-SYMBOLS <table> TYPE ANY TABLE.
  FIELD-SYMBOLS <wa>    TYPE ANY.
  FIELD-SYMBOLS <value> TYPE ANY.

*** create table dynamically
  CREATE DATA dref TYPE STANDARD TABLE OF (fi_tabname).

*** assign referenced table to table-field-symbol
  ASSIGN dref->* TO <table>.

*** Print protocol
  WRITE: / fi_tabname.

*** Select data into internal table
  SELECT * FROM (fi_tabname) INTO TABLE <table>.

  IF sy-subrc = 0.
*** in this case the field to be changed is a key field…
*** delete existing entries

    DELETE (fi_tabname) FROM TABLE <table>.

*** set new value for each entry
    LOOP AT <table> ASSIGNING <wa>.
      ASSIGN COMPONENT ‘FIELDNAME’ OF STRUCTURE <wa> TO <value>.
      IF sy-subrc = 0.
        SHIFT <value> LEFT BY 4 PLACES.
      ENDIF.
    ENDLOOP.

*** and insert changed entries
    INSERT (fi_tabname) FROM TABLE <table>.
    IF sy-subrc = 0.
*** everything ok: commit changes
      WRITE: ‘Modify ok, Entries:’, sy-dbcnt.
      COMMIT WORK.
    ELSE.
*** something went wrong: rollback
      WRITE: ‘Modify failure!’.
      ROLLBACK WORK.
    ENDIF.
  ELSE.
*** protocol
    WRITE: ‘Nothing selected…’.
  ENDIF.

ENDFORM.                   

Enno Wulff